fix: 펫 신원 인증 — 기준 프레임↔영상 동일 출처 검증(섀도) + 라이브니스 하한 재검토(도입 보류) - #134
Open
seizeh wants to merge 4 commits into
Open
Conversation
- enroll-pet-identity: frames[] 를 검증 없이 기준셋으로 저장하던 구멍 차단. 기존 Gemini 호출에 프레임을 함께 넣어 frames_from_video(영상과 같은 개체·배경·촬영 세션) 판정, 불일치 시 frames_not_from_video 거절+기록. - verify-post-photo: 선언만 있던 AI_REAL_THRESHOLD(0.70) 를 라이브니스 게이트에 연결(is_real && real>=0.70 && real>fake). isMocked/좌표가 클라이언트 자기신고임을 신뢰 경계 주석으로 명시. - docs/supabase-api.md: 두 함수 스펙 갱신 + 구버전 challenge 잔재 정리, 종 불일치 하드 게이트(species_mismatch) 반영. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
리뷰 반영 — 측정 없는 하드 리젝 두 개를 걷어낸다: - enroll-pet-identity: frames_from_video 를 섀도 모드로 전환 (FRAMES_FROM_VIDEO_ENFORCE=false). 판정 false 는 photo_verifications(fail_reason='frames_not_from_video') 에 기록만 하고 등록은 통과 — challenge 를 오탐으로 제거한 전례에 따라 오탐률 측정 후 하드 게이트로 전환. 오탐 소지: 클라 프레임 추출 시각(800/2500/4000/5500ms) 과 Gemini 1fps 샘플링 어긋남. - enroll-pet-identity: 인라인 페이로드 합계 19M chars 가드 — Gemini 20MB 한도 초과가 ai_unavailable 로 뭉개지지 않고 video_too_large(400) 로 구분 (죽어 있던 클라 메시지 케이스 소생). - verify-post-photo: real>=0.70 하한 되돌림 + AI_REAL_THRESHOLD 삭제. 사진 1장 판정은 저조도·역광·블러에 민감해 절대 하한을 두지 않는다 (영상 11초 기반 enroll 과 모달리티가 달라 대칭 근거 없음). 라이브니스는 is_real && real>fake 로 복귀. - docs: supabase-api.md 섀도 모드·페이로드 한도·하한 제거 반영, supabase-db.md purpose CHECK 에 'pet_identity' 누락 보정(20260713112529). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
리뷰 반영: 섀도 모드가 분자(false 판정)만 남기고 분모(판정받은 전체 등록)를 안 남겨 오탐률을 낼 수 없었고, result='fail' 행이 강제 전환 후의 실제 거절과 같은 모양이라 시맨틱이 충돌했다. - 성공 등록마다 photo_verifications 에 판정 1행(result='pass', ai_pass=판정값, false 면 fail_reason='frames_not_from_video_shadow'). 분모 = purpose='pet_identity' AND result='pass' 전체, 분자 = _shadow 행. _shadow 접미사로 강제 전환 후의 거절 행과 영구 구분. 즉시 만료 + region_matched=false + image_url=null 이라 게시 토큰 소비 조건에 안 걸림(오용 불가). - 섀도 중 fail 행을 남기던 logEnrollFail 분기는 강제 모드 전용으로 이동. - video_too_large 도 같은 병 수정: 거절 시 inlineChars 실측 console 로그 + 실패 행 기록(발생 빈도·분포 확인용). 가드를 보호자 확인 뒤로 이동. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This was referenced Jul 29, 2026
베타 전환 결정 반영: 업체 파일럿만으로는 신원 인증 계열 표본이 안 모이는 갭을 명시하고, 개인 사용자 클로즈드 베타 트랙과 정식 출시 전 확인 조건 (frames_from_video 30건, 0.63 근거, video_too_large 분포, 관측성 진입 조건) 을 추가. 섀도 윈도우 노출은 수용 리스크로 기록. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
배경
설계 리뷰에서 확인된 구멍:
enroll-pet-identity가 영상만 Gemini로 검증하고frames[]는 아무 검사 없이 기준셋으로 저장했다. 아무 라이브 영상 + 다른 개체 사진 조합의 직접 POST로 타 개체가 기준셋에 등록되면 이후 게시글 매칭 전체가 무력화된다.변경 (커밋 3개)
23a7ed4 — 프레임↔영상 바인딩
enroll-pet-identity: 기존 Gemini 호출 하나에 프레임을 함께 넣어frames_from_video(같은 개체·배경·촬영 세션) 판정. 호출 횟수 그대로 1회.23f4b52 — 측정 없는 하드 리젝 제거
frames_from_video를 섀도 모드로(FRAMES_FROM_VIDEO_ENFORCE=false) — challenge 를 오탐으로 제거한 전례에 따라 오탐률 측정 후 활성화. 오탐 소지: 클라 프레임 추출 시각(800/2500/4000/5500ms)과 Gemini 1fps 샘플링 어긋남.verify-post-photo: 1차 커밋에서 켰던real>=0.70하한 되돌림 +AI_REAL_THRESHOLD삭제. 사진 1장 판정은 저조도·역광·블러에 민감해 절대 하한 없이is_real && real>fake만 사용(영상 11초 기반 enroll 과 모달리티가 달라 대칭 근거 없음).video_too_large, Gemini 20MB 보호선).supabase-api.md갱신(+구버전 challenge 잔재 정리,species_mismatch하드 게이트 반영),supabase-db.mdpurpose CHECK 'pet_identity' 누락 보정.355a8d9 — 섀도 판정을 측정 가능하게
photo_verifications에 기록 — 분모 =purpose='pet_identity' AND result='pass'전체, 분자 = 그중fail_reason='frames_not_from_video_shadow'._shadow접미사는 강제 전환 후의 실제 거절 행과의 영구 구분자. 즉시 만료+region_matched=false+image_url=null이라 게시 토큰으로 소비 불가.video_too_large거절 시inlineChars실측 로그 + 실패 행 기록(발생 빈도 측정, 가드는 보호자 확인 뒤로).신뢰 경계 — 이 PR이 막는 것과 못 막는 것
isMocked/좌표는 클라이언트 자기신고(코드 주석으로 명시).배포
enroll-pet-identity v23, verify-post-photo v19 ACTIVE (본 PR 최종 내용).
후속
클라이언트 대응: seizeh/pmdart#212
🤖 Generated with Claude Code